package cc.comac.mom.datahandlers.entity;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;

import cc.comac.mom.bean.EquipDevType;
import cc.comac.mom.bean.ResultDev;
import cc.comac.mom.dao.entity.EquipDevCategoryDao;
import cc.comac.mom.dao.entity.EquipDevTypeDao;
import cc.comac.mom.entity.EquipDevCategoryEntity;
import cc.comac.mom.entity.EquipDevTypeEntity;
import cc.comac.mom.util.BaseEntityDataUtil;
@Component
@Transactional
public class EquipDevTypeDataHandler extends ServiceImpl<EquipDevTypeDao, EquipDevTypeEntity>{
	@Autowired
	private EquipDevTypeDao equipDevTypeDao;
	
	@Autowired
	private EquipDevCategoryDao equipDevCategoryDao;
	
	@Autowired
	private BaseEntityDataUtil baseEntityDataUtil;
	public int insert(EquipDevType equipDevType) {
		if (StringUtils.isEmpty(equipDevType.getDevTypeNumber())) {
			throw new RuntimeException("设备主类编号不能为空！");
		}
		// 校验主类编号是否重复
		Map<String, Object> map = new HashMap<String, Object>();
		 map.put("dev_type_number", equipDevType.getDevTypeNumber());
		 map.put("row_status", 1);
		List<EquipDevTypeEntity> selectByMap = equipDevTypeDao.selectByMap(map);
		if (selectByMap.size() > 0) {
			throw new RuntimeException("主类编号"+equipDevType.getDevTypeNumber()+"已存在！");
		}

		// 校验主类名称是否重复
		Map<String, Object> mapName = new HashMap<String, Object>();
		mapName.put("dev_type_name", equipDevType.getDevTypeName());
		mapName.put("row_status", 1);
		List<EquipDevTypeEntity> selectByMapName = equipDevTypeDao.selectByMap(mapName);
		if (selectByMapName.size() > 0) {
			throw new RuntimeException("主类名称"+equipDevType.getDevTypeName()+"已存在！");
		}

		// 保存数据
		if (equipDevType.getEnable() == null) {
			equipDevType.setEnable(1L);
		}
		baseEntityDataUtil.setBaseEntityData(equipDevType);
		EquipDevTypeEntity equipDevTypeEntity=(EquipDevTypeEntity)equipDevType;
		Integer insert = equipDevTypeDao.insert(equipDevTypeEntity);
		if (insert != 1) {
			throw new RuntimeException("新增失败，新增总数量"+insert);
		}
		return insert;
	}
	
	public int update(EquipDevType equipDevType) {
		if (equipDevType.getId() == 0) {
			throw new RuntimeException("当前未选择数据！,id为0");
		}
		// 当编号不为空
		if (StringUtils.isNotEmpty(equipDevType.getDevTypeNumber())) {
			// 校验主类编号是否重复
			Map<String, Object> map = new HashMap<String, Object>();
			 map.put("dev_type_number", equipDevType.getDevTypeNumber());
			 map.put("row_status", 1);
			List<EquipDevTypeEntity> selectByMap = equipDevTypeDao.selectByMap(map);
			if (selectByMap.size() > 0) {
				for (EquipDevTypeEntity equipDevTypeEntity : selectByMap) {
					if (equipDevTypeEntity.getId() != equipDevType.getId()) {
						throw new RuntimeException("主类编号"+equipDevType.getDevTypeNumber()+"已存在！");
					}
				}
			}
		}

		// 当名称不为空
		if (StringUtils.isNotEmpty(equipDevType.getDevTypeName())) {
			// 校验主类名称是否重复
			Map<String, Object> map = new HashMap<String, Object>();
			map.put("dev_type_name", equipDevType.getDevTypeName());
			map.put("row_status", 1);
			List<EquipDevTypeEntity> selectByMap = equipDevTypeDao.selectByMap(map);
			if (selectByMap.size() > 0) {
				for (EquipDevTypeEntity equipDevTypeEntity : selectByMap) {
					if (equipDevTypeEntity.getId() != equipDevType.getId()) {
						throw new RuntimeException("主类名称"+equipDevType.getDevTypeName()+"已存在！");
					}
				}
			}
		}

		// 更新数据
		baseEntityDataUtil.updateBaseEntityData(equipDevType);
		Integer updateById = equipDevTypeDao.update(equipDevType, new QueryWrapper<EquipDevTypeEntity>().eq("dev_type_id", equipDevType.getId()));
		if (updateById != 1) {
			throw new RuntimeException("更新失败，更新数量为" + updateById);
		}
		return updateById;
	}
	
	public int batchDelete (List<EquipDevType> equipDevTypeList) {
		List<EquipDevTypeEntity> list = new ArrayList<EquipDevTypeEntity>();
		// 预留删除校验
		QueryWrapper<EquipDevCategoryEntity> queryWrapper = new QueryWrapper<EquipDevCategoryEntity>();
		QueryWrapper<EquipDevTypeEntity> queryWrapper1 = new QueryWrapper<EquipDevTypeEntity>();
		List<Long> typeIdsList = new ArrayList<Long>();
		// 获取需删除的数据中引入的所有设备主类主键，查询设备类型信息
		for (EquipDevType equipDevType : equipDevTypeList) {
			typeIdsList.add(equipDevType.getId());
		}
		queryWrapper.in("dev_type_id", typeIdsList);
		queryWrapper.in("row_status", 1);
		queryWrapper1.in("dev_type_id", typeIdsList);
		queryWrapper1.in("row_status", 1);
		// 通过设备类型主键集合查询所有设备类型信息
		List<EquipDevCategoryEntity> selectList = equipDevCategoryDao.selectList(queryWrapper);
		// 通过设备主类集合主键查询数据
		List<EquipDevTypeEntity> selectList2 = equipDevTypeDao.selectList(queryWrapper1);
		// 判断设备主类是否被引用
		if (selectList.size()>0) {
			for (EquipDevTypeEntity equipDevTypeEntity : selectList2) {
				for (EquipDevCategoryEntity equipDevCategoryEntity : selectList) {
					if (equipDevTypeEntity.getId() == equipDevCategoryEntity.getDevTypeId()) {
						throw new RuntimeException("删除的设备主类"+ equipDevTypeEntity.getDevTypeName() + "被设备类型"+equipDevCategoryEntity.getDevCategoryName()+"引用，无法删除！");
					}
				}
			}
		}
		
		
		for (EquipDevType equipDevType2 : equipDevTypeList) {
			EquipDevTypeEntity equipDevTypeEntity = new EquipDevTypeEntity();
			equipDevTypeEntity.setId(equipDevType2.getId());
			baseEntityDataUtil.updateBaseEntityData(equipDevTypeEntity);
			equipDevTypeEntity.setRowStatus(0);
			list.add(equipDevTypeEntity);
		}
		// 批量更新数据
		boolean updateBatchById = updateBatchById(list);
		if (!updateBatchById) {
			throw new RuntimeException("删除失败");
		}
		return updateBatchById ? 1:0;
	}

	public ResultDev selectAllByPage(EquipDevType equipDevType) {
		ResultDev resultDev = new ResultDev();
		QueryWrapper<EquipDevTypeEntity> queryWrapper = new QueryWrapper<EquipDevTypeEntity>();
        queryWrapper.eq("row_status", 1);
        if (equipDevType.getPageNum() == null || equipDevType.getPageNum() == 0) {
			equipDevType.setPageNum(1L);
		}
		if (equipDevType.getPageSize() == null || equipDevType.getPageSize() == 0) {
			equipDevType.setPageSize(10L);
		}
        if (!(equipDevType.getDevTypeNumber() == null || equipDevType.getDevTypeNumber().equals(""))) {
			queryWrapper.like("dev_type_number", equipDevType.getDevTypeNumber());
		}
		if (!(equipDevType.getDevTypeName() == null || equipDevType.getDevTypeName().equals(""))) {
			queryWrapper.like("dev_type_name", equipDevType.getDevTypeName());
		}
        queryWrapper.orderByDesc("creation_time");
//    不返回总记录数 设置false
      Page<EquipDevTypeEntity> page = new Page<>(equipDevType.getPageNum(), equipDevType.getPageSize(), true);
      IPage<EquipDevTypeEntity> iPage = equipDevTypeDao.selectPage(page, queryWrapper);
    System.out.println("总页数:"+iPage.getPages());
    System.out.println("总记录数:"+iPage.getTotal());
    List<EquipDevTypeEntity> records = iPage.getRecords();
    resultDev.setEntityList(records);
    resultDev.setTotalQuantity((int)iPage.getTotal());
    resultDev.setPageCount((int)iPage.getPages());
		return resultDev;
	}
	
	public ResultDev selectBySomeField(EquipDevType equipDevType) {

		ResultDev resultDev = new ResultDev();
		QueryWrapper<EquipDevTypeEntity> queryWrapper = new QueryWrapper<EquipDevTypeEntity>();
		queryWrapper.eq("row_status", 1);
		 queryWrapper.orderByDesc("creation_time");
		if (equipDevType.getPageNum() == null || equipDevType.getPageNum() == 0) {
			equipDevType.setPageNum(1L);
		}
		if (equipDevType.getPageSize() == null || equipDevType.getPageSize() == 0) {
			equipDevType.setPageSize(10L);
		}
		if (!(equipDevType.getDevTypeNumber() == null || equipDevType.getDevTypeNumber().equals(""))) {
			queryWrapper.like("dev_type_number", equipDevType.getDevTypeNumber());
		}
		if (!(equipDevType.getDevTypeName() == null || equipDevType.getDevTypeName().equals(""))) {
			queryWrapper.like("dev_type_name", equipDevType.getDevTypeName());
		}
		
		//	    不返回总记录数 设置false
	      Page<EquipDevTypeEntity> page = new Page<>(equipDevType.getPageNum(), equipDevType.getPageSize(), true);
	      IPage<EquipDevTypeEntity> iPage = equipDevTypeDao.selectPage(page, queryWrapper);
	      List<EquipDevTypeEntity> records = iPage.getRecords();
	      resultDev.setEntityList(records);
	      resultDev.setTotalQuantity((int)iPage.getTotal());
	      resultDev.setPageCount((int)iPage.getPages());
		return resultDev;
	}

	@Override
	public boolean updateBatchById(Collection<EquipDevTypeEntity> entityList) {
		return super.updateBatchById(entityList);
	}

	// 查询所有已经启用的数据
	
	public List<EquipDevTypeEntity> getAllEnable() {
		QueryWrapper<EquipDevTypeEntity> queryWrapper = new QueryWrapper<EquipDevTypeEntity>();
		queryWrapper.eq("enable", 1);
		queryWrapper.eq("row_status", 1);
		List<EquipDevTypeEntity> selectList = equipDevTypeDao.selectList(queryWrapper);
		return selectList;
	}
	
	
	
}
